//给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 
//
// 
//
// 示例 1: 
//
// 
// 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 
// 
//
// 输出: [["bat"],["nat","tan"],["ate","eat","tea"]] 
//
// 解释： 
//
// 
// 在 strs 中没有字符串可以通过重新排列来形成 "bat"。 
// 字符串 "nat" 和 "tan" 是字母异位词，因为它们可以重新排列以形成彼此。 
// 字符串 "ate" ，"eat" 和 "tea" 是字母异位词，因为它们可以重新排列以形成彼此。 
// 
//
// 示例 2: 
//
// 
// 输入: strs = [""] 
// 
//
// 输出: [[""]] 
//
// 示例 3: 
//
// 
// 输入: strs = ["a"] 
// 
//
// 输出: [["a"]] 
//
// 
//
// 提示： 
//
// 
// 1 <= strs.length <= 10⁴ 
// 0 <= strs[i].length <= 100 
// strs[i] 仅包含小写字母 
// 
//
// Related Topics 数组 哈希表 字符串 排序 👍 2358 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    static class ArrayKey{
        int[] key = new int[26];

        public boolean equals(Object object) {
            if (this == object) return true;
            if (object == null || getClass() != object.getClass()) return false;
            // 移除super.equals判断，因为父类是Object，其equals比较的是地址
//            if (!super.equals(object)) return false;//(这行IDEA自动生成的代码要删掉)
            ArrayKey arrayKey = (ArrayKey) object;
            return java.util.Arrays.equals(key, arrayKey.key);
        }

        public int hashCode() {
//            int result = super.hashCode();
//            result = 31 * result + java.util.Arrays.hashCode(key);
//            return result;
            return Arrays.hashCode(key); // 简化hashCode计算，无需叠加super.hashCode()
        }

        public ArrayKey(String str){
            for(int i=0; i<str.length(); i++){
                char ch = str.charAt(i);//
                key[ch-'a'] ++;// 使用字符'a'更直观，避免97的魔法数字
//                key[ch-97] ++;
            }
        }

    }
    public List<List<String>> groupAnagrams(String[] strs) {
//        Map<String, List<String>> map = new HashMap<>();
//        for (String str : strs) {
//            char[] chars = str.toCharArray();
//            Arrays.sort(chars);
//            String key = new String(chars);
//            //1.
////            map.putIfAbsent(key, new ArrayList<>());
////            map.get(key).add(str);
////            map.put(key, map.get(key));
//            //2.
////            List<String> list = map.get(key);
////            if (list == null) {
////                list = new ArrayList<>();
////                map.put(key,list);
////            }
//            List<String> list = map.computeIfAbsent(key, k -> new ArrayList<>());
//            list.add(str);
//        }
//        return new ArrayList<>(map.values());
        HashMap<ArrayKey, List<String>> map = new HashMap<>();
        for (String str : strs) {
            ArrayKey key = new ArrayKey(str);
            List<String> list = map.computeIfAbsent(key, k -> new ArrayList<>());
            list.add(str);
        }
        return new ArrayList<>(map.values());
    }
}
//leetcode submit region end(Prohibit modification and deletion)
